/**
 * Application's Objects
 * @type Object
 */
var joApps = {};

/**
 * アプリケーションを管理する
 * @class
 */
var joAppManager = {

	/**
	 * Installed Applications
	 * @type Array
	 */
	apps: [
		'Menubar',
		'Finder',
		'TextEditor',
		'Console',
		'PrefManager',
		'WebViewer'
	],

	init: function(){
		var self = joAppManager;

		return Deferred.loop(self.apps.length, function(i){
			return joCore.IO.read('apps/' + self.apps[i] + '/' + self.apps[i] + '.app.js', 'text/plain').
					next(function(data){
						//無名関数で包んで実行する
						eval('(function(){' + data.responseText + '})();');
						
						//joApps以下に正しくインストールされなかったものは無効化する
						//きちんとインストールされたものはonloadを実行
						if(!joApps[self.apps[i]]){
						
						}else if(typeof joApps[self.apps[i]].onload === 'function'){
							joApps[self.apps[i]].onload();
						}
						
						var file = joFileManager.createFile(self.apps[i] + '.app', 'dinos://Applications/',
															{ oncommand: 'joApps.' + self.apps[i] + '.start();' } );
					});
		});
	},

	uninit: function(){

	},

	/**
	 * アプリケーション切り替え時に呼び出される
	 *
	 * @param {String} aAppName 切り替え後のアプリケーション名
	 */
	changeActiveApp: function(aAppName){
		if(this.activeName === aAppName || aAppName === 'System') return;
		joApps.Menubar.update(joApps[aAppName].menubar);
		this.activeName = aAppName;
	},

	/**
	 * 最も前面にあるウィンドウを得る
	 *
	 * @param {String} [aAppName] 指定したアプリケーションのウィンドウに限定する
	 * @return {Node} 見つからないときは null を返す
	 */
	getFrontWindow: function(aAppName){
		if(!aAppName) aAppName = '';

		var _active = uuQuery('[active="true"]');
		
		if(_active.length && joCore.Node.hasClass(_active[0], aAppName)) return _active[0];

		return (function(){
			//[active=true]なwindowがない時はより厳密に判定してみる
			var windows = aAppName ? $C(aAppName, $('windows')) : $C('window', $('windows'));
			var max = 0, frontWindow = null;

			if(!windows) return null;

			for(var i=0,l=windows.length;i<l;i++){
				if(max < windows[i].style.zIndex){
					max = windows[i].style.zIndex;
					frontWindow = windows[i];
				}
			}

			return frontWindow;
		})();
	},
};